// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "GameSettingValueDiscrete.h"

#include "LyraSettingValueDiscrete_Resolution.generated.h"

namespace EWindowMode { enum Type : int; }

class UObject;
struct FScreenResolutionRHI;

/**
 * 分辨率离散值设置类，继承自UGameSettingValueDiscrete
 */
UCLASS()
class ULyraSettingValueDiscrete_Resolution : public UGameSettingValueDiscrete
{
	GENERATED_BODY()
	
public:

	ULyraSettingValueDiscrete_Resolution();

	/** UGameSettingValue */
	/**
	 * 存储初始设置
	 */
	virtual void StoreInitial() override;
	/**
	 * 重置为默认值
	 */
	virtual void ResetToDefault() override;
	/**
	 * 恢复到初始值
	 */
	virtual void RestoreToInitial() override;

	/** UGameSettingValueDiscrete */
	/**
	 * 根据索引设置离散选项
	 */
	virtual void SetDiscreteOptionByIndex(int32 Index) override;
	/**
	 * 获取离散选项索引
	 */
	virtual int32 GetDiscreteOptionIndex() const override;
	/**
	 * 获取离散选项
	 */
	virtual TArray<FText> GetDiscreteOptions() const override;

protected:
	/** UGameSettingValue */
	/**
	 * 初始化时调用
	 */
	virtual void OnInitialized() override;
	/**
	 * 依赖项更改时调用
	 */
	virtual void OnDependencyChanged() override;

	/**
	 * 初始化分辨率
	 */
	void InitializeResolutions();
	/**
	 * 检查是否允许全屏分辨率
	 */
	bool ShouldAllowFullScreenResolution(const FScreenResolutionRHI& SrcScreenRes, int32 FilterThreshold) const;
	/**
	 * 获取标准窗口分辨率
	 */
	static void GetStandardWindowResolutions(const FIntPoint& MinResolution, const FIntPoint& MaxResolution, float MinAspectRatio, TArray<FIntPoint>& OutResolutions);
	/**
	 * 选择适当的分辨率
	 */
	void SelectAppropriateResolutions();
	/**
	 * 查找显示分辨率的索引
	 */
	int32 FindIndexOfDisplayResolution(const FIntPoint& InPoint) const;
	/**
	 * 强制查找显示分辨率的索引
	 */
	int32 FindIndexOfDisplayResolutionForceValid(const FIntPoint& InPoint) const;
	/**
	 * 查找最接近的分辨率索引
	 */
	int32 FindClosestResolutionIndex(const FIntPoint& Resolution) const;

	TOptional<EWindowMode::Type> LastWindowMode; // 最后窗口模式

	/**
	 * 屏幕分辨率条目结构
	 */
	struct FScreenResolutionEntry
	{
		uint32	Width = 0; // 宽度
		uint32	Height = 0; // 高度
		uint32	RefreshRate = 0; // 刷新率
		FText   OverrideText; // 覆盖文本

		/**
		 * 获取分辨率
		 */
		FIntPoint GetResolution() const { return FIntPoint(Width, Height); }
		/**
		 * 获取显示文本
		 */
		FText GetDisplayText() const;
	};

	/** 根据窗口模式映射到分辨率的字符串数组 */
	TArray< TSharedPtr< FScreenResolutionEntry > > Resolutions; // 分辨率数组

	/** 映射到全屏分辨率的字符串数组 */
	TArray< TSharedPtr< FScreenResolutionEntry > > ResolutionsFullscreen; // 全屏分辨率数组

	/** 映射到窗口化全屏分辨率的字符串数组 */
	TArray< TSharedPtr< FScreenResolutionEntry > > ResolutionsWindowedFullscreen; // 窗口化全屏分辨率数组

	/** 映射到窗口化分辨率的字符串数组 */
	TArray< TSharedPtr< FScreenResolutionEntry > > ResolutionsWindowed; // 窗口化分辨率数组
};